/*
 * Copyright (c) 2012 SUBSECRETARIA DEFENSORIA DEL ESPACIO PUBLICO - SDEP.
 * All Rights Reserved.
 * This software is the confidential and proprietary information of SDEP
 * Developed By CONSTULT-SOFT S.A, Development Team 2012.
 * 
 */
package co.gov.medellin.sdep.sisdep.model.dao.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.springframework.transaction.PlatformTransactionManager;

import co.gov.medellin.sdep.sisdep.common.OracleHelper;
import co.gov.medellin.sdep.sisdep.common.dto.GenericComponentVO;
import co.gov.medellin.sdep.sisdep.common.dto.GenericComponentValueVO;
import co.gov.medellin.sdep.sisdep.model.Modulo;
import co.gov.medellin.sdep.sisdep.model.dao.ModuloDAOImpl;


/**
 * <p>
 * Implementacion de los metodos especializados de acceso a datos, necesarios para la gestion de Modulos de los 
 * comerciantes en SISDEP.
 * </p>
 * <p>
 * Copyright (c) 2012<BR>
 * Consult-Soft S.A.<BR>
 * Created on: May 01, 2012<BR>
 * 
 * @author atabares
 * </p>
 */
public class ModuloDAOTImpl extends ModuloDAOImpl implements IModuloDAOT {

	/** Manejador de transacciones para ModuloDAOTImpl. */
	private PlatformTransactionManager transactionManager;
	
	/**
	 * Constructor por defecto.
	 */
	public ModuloDAOTImpl() {
	}

	/**
	 * Retorna el transactionManager.
	 * @return
	 */
	public PlatformTransactionManager getTransactionManager() {
		return transactionManager;
	}

	/**
	 * Establece el transaction manager establecido en la configuracion.
	 * @param transactionManager
	 */
	public void setTransactionManager(PlatformTransactionManager transactionManager) {
		this.transactionManager = transactionManager;
	}
	
	/* (non-Javadoc)
	 * @see co.gov.medellin.sdep.sisdep.model.dao.impl.IModuloDAOT#getModuloListByCriteria(co.gov.medellin.sdep.sisdep.model.Modulo)
	 */
	public List getModuloListByCriteria(Modulo modulo) {
		
		StringBuffer query = new StringBuffer();
		
		query.append("SELECT DISTINCT MODU.ID, MODU.CODIGO, MODUDIS.ESTILO, MODU.DIRECCION_MODULO, ");
		query.append("MODU.BARRIO, MODU.COMUNA, MODU.ESTADO, MODU.ESTADO_FINANCIERO, MODU.VALOR_MORA, ");
		query.append("MODU.FACTURA, VLRTPO.VRT_NOMBRE, MODU.PLAQUETA_HACIENDA ");
		query.append("FROM GES_MODULO_T MODU ");
		query.append("JOIN GES_MODULO_DISENO_T MODUDIS ON MODUDIS.ID = MODU.ID_MODULO_DISENO ");
		query.append("JOIN ADM_VALOR_TIPO_MAESTRA_T VLRTPO ON MODU.TIPO_ENERGIA = VLRTPO.ID_VALOR_TIPO ");
		
		if (modulo.getIdModuloDiseno() != null) {
            query.append("AND MODU.ID_MODULO_DISENO = ? ");
        }
		
		if (!OracleHelper.isNullorEmpty(modulo.getCodigo())) {
            query.append("AND MODU.CODIGO = ? ");
        }
		
		if (!OracleHelper.isNullorEmpty(modulo.getCodigoBarrio())) {
            query.append("AND MODU.CODIGO_BARRIO = ? ");
        }
		
		if (!OracleHelper.isNullorEmpty(modulo.getCodigoComuna())) {
            query.append("AND MODU.CODIGO_COMUNA = ? ");
        }
		
		if (!OracleHelper.isNullorEmpty(modulo.getEstado())) {
            query.append("AND MODU.ESTADO = ? ");
        }
		
		if (!OracleHelper.isNullorEmpty(modulo.getPlaquetaHacienda())) {
            query.append("AND MODU.PLAQUETA_HACIENDA = ? ");
        }
		
		query.append(" ORDER BY MODU.CODIGO");
		
		List params = new ArrayList();
		
		if (modulo.getIdModuloDiseno() != null) {
			params.add(modulo.getIdModuloDiseno());
        }
		
		if (!OracleHelper.isNullorEmpty(modulo.getCodigo())) {
			params.add(modulo.getCodigo());
        }
		
		if (!OracleHelper.isNullorEmpty(modulo.getCodigoBarrio())) {
			params.add(modulo.getCodigoBarrio());
        }
		
		if (!OracleHelper.isNullorEmpty(modulo.getCodigoComuna())) {
			params.add(modulo.getCodigoComuna());
        }
		
		if (!OracleHelper.isNullorEmpty(modulo.getEstado())) {
			params.add(modulo.getEstado());
        }
		
		if (!OracleHelper.isNullorEmpty(modulo.getPlaquetaHacienda())) {
			params.add(modulo.getPlaquetaHacienda());
        }
				
    	List rows = this.getJdbcTemplate().queryForList(query.toString(), params.toArray());
		
    	List moduloList = new ArrayList();
    	Iterator iterator = rows.iterator();
    	
    	while (iterator.hasNext()) {
    		Map moduloMap = (Map) iterator.next();
    		
    		Modulo moduloTemp = new Modulo();
    		
    		moduloTemp.setId(new Long(((BigDecimal) moduloMap.get("ID")).longValue()));
			moduloTemp.setCodigo((String) moduloMap.get("CODIGO"));
			moduloTemp.setModuloDiseno((String) moduloMap.get("ESTILO"));
			moduloTemp.setDireccionModulo((String) moduloMap.get("DIRECCION_MODULO"));
			moduloTemp.setBarrio((String) moduloMap.get("BARRIO"));
			moduloTemp.setComuna((String) moduloMap.get("COMUNA"));
			moduloTemp.setEstado((String) moduloMap.get("ESTADO"));
			
			if (moduloMap.get("ESTADO_FINANCIERO") != null) {
				moduloTemp.setEstadoFinanciero((String) moduloMap.get("ESTADO_FINANCIERO"));
			}
			
			if (moduloMap.get("VALOR_MORA") != null) {
				moduloTemp.setValorMora(new Long(((BigDecimal) moduloMap.get("VALOR_MORA")).longValue()));
			}
			
			moduloTemp.setFactura((String) moduloMap.get("FACTURA"));
			moduloTemp.setEnergia((String) moduloMap.get("VRT_NOMBRE"));
			
			if (moduloMap.get("PLAQUETA_HACIENDA") != null) {
				moduloTemp.setPlaquetaHacienda((String) moduloMap.get("PLAQUETA_HACIENDA"));
			}
			
			moduloList.add(moduloTemp);
    	}
		
		return moduloList;
	}

	/* (non-Javadoc)
	 * @see co.gov.medellin.sdep.sisdep.model.dao.impl.IModuloDAOT#getModuloDisenoList()
	 */
	public GenericComponentVO getModuloDisenoList() {
		StringBuffer query = new StringBuffer();
		
		query.append("SELECT DISTINCT ID, ESTILO ");
		query.append("FROM GES_MODULO_DISENO_T ");
		query.append("ORDER BY ESTILO");
		
		List rows = this.getJdbcTemplate().queryForList(query.toString());
		
    	Iterator iterator = rows.iterator();
    	GenericComponentVO genericComponentVO = new GenericComponentVO();
    	
    	while (iterator.hasNext()) {
    		Map moduloMap = (Map) iterator.next();
    		GenericComponentValueVO genericComponentValueVO = new GenericComponentValueVO();
    		
    		genericComponentValueVO.setComponentValueId(((BigDecimal) moduloMap.get("ID")).toString());
    		genericComponentValueVO.setComponentValueName((String) moduloMap.get("ESTILO"));
			
    		genericComponentVO.getComponentValueList().add(genericComponentValueVO);
    	}
		
		return genericComponentVO;
	}

}
